﻿//ChartIndicatorElement.cs
//Copyright (c) 2013 StockSharp LLC, all rights reserved.
//This code module is part of StockSharp library.
//This code is licensed under the GNU GENERAL PUBLIC LICENSE Version 3.
//See the file License.txt for the license details.
//More info on: http://stocksharp.com

namespace StockSharp.Xaml
{
	using System;
	using System.ComponentModel;
	using System.Windows.Media;

	using Ecng.Common;
	using Ecng.Serialization;
	using Ecng.Xaml;

	using StockSharp.Algo.Indicators;

	using Xceed.Wpf.Toolkit.PropertyGrid.Attributes;

	/// <summary>
	/// Элемент графика, представляющий индикатор.
	/// </summary>
	[DisplayName("Настройки индикатора")]
	public class ChartIndicatorElement : ChartElement<ChartIndicatorElement>
	{
		/// <summary>
		/// Создать <see cref="ChartIndicatorElement"/>.
		/// </summary>
		public ChartIndicatorElement()
		{
		    Color = Colors.Green;
		}

		private IIndicator _indicator;

		/// <summary>
		/// Индикатор.
		/// </summary>
		[DisplayName("Индикатор")]
		[Description("Параметры индикатора.")]
		[Category("Параметры")]
		[ExpandableObject]
		public IIndicator Indicator
		{
			get { return _indicator; }
			set
			{
				_indicator = value;

				if (value == null)
				{
					Title = string.Empty;
				}
				else
				{
					Title = value.Name;
					Id = value.Id;
				}
			}
		}

		private string _title;

		/// <summary>
		/// Заголовок индикатора, который будет отображаться на графике.
		/// </summary>
		[DisplayName("Заголовок")]
		[Description("Заголовок индикатора, который будет отображаться на графике.")]
		[Category(ViewCategory)]
		public string Title
		{
			get { return _title; }
			set
			{
				_title = value;
				RaisePropertyChanged("Title");
			}
		}

		/// <summary>
		/// Подсказка для индикатора на графике.
		/// </summary>
		[DisplayName("Подсказка")]
		[Description("Подсказка для индикатора на графике.")]
		[Category(ViewCategory)]
		public string ToolTip { get; set; }

		/// <summary>
		/// Цвет линии (бара и т.д.), которой будет рисоваться на графике индикатор.
		/// </summary>
		[DisplayName("Цвет")]
		[Description("Цвет линии (бара и т.д.), которой будет рисоваться на графике индикатор.")]
		[Category(ViewCategory)]
		public Color Color { get; set; }

		private IChartIndicatorPainter _indicatorPainter;

		/// <summary>
		/// Рендерер индикатора.
		/// </summary>
		[Browsable(false)]
		public IChartIndicatorPainter IndicatorPainter
		{
			get { return _indicatorPainter; }
			set
			{
				_indicatorPainter = value;

				if (_indicatorPainter != null)
					_indicatorPainter.Indicator = this;
			}
		}

		/// <summary>
		/// Загрузить настройки.
		/// </summary>
		/// <param name="storage">Хранилище настроек.</param>
		public override void Load(SettingsStorage storage)
		{
			base.Load(storage);

			Title = storage.GetValue<string>("Title");
			Color = System.Drawing.Color.FromArgb(storage.GetValue<int>("Color")).ToWpf();

			if (storage.Contains("ToolTip"))
				ToolTip = storage.GetValue<string>("ToolTip");

			var type = storage.GetValue<Type>("IndicatorType");
			var indicator = type.CreateInstance<IIndicator>();
			// mika: сначала подгружаем Id индикатора
			indicator.Load(storage.GetValue<SettingsStorage>("Indicator"));
			Indicator = indicator;

			if (storage.ContainsKey("IndicatorPainter"))
				IndicatorPainter = storage.GetValue<Type>("IndicatorPainter").CreateInstance<IChartIndicatorPainter>();
		}

		/// <summary>
		/// Сохранить настройки.
		/// </summary>
		/// <param name="storage">Хранилище настроек.</param>
		public override void Save(SettingsStorage storage)
		{
			base.Save(storage);

			storage.SetValue("Title", Title);
			storage.SetValue("Color", Color.ToWin().ToArgb());
			storage.SetValue("ToolTip", ToolTip);

			storage.SetValue("IndicatorType", Indicator.GetType().AssemblyQualifiedName);
			storage.SetValue("Indicator", Indicator.Save());
		}

		/// <summary>
		/// Создать копию элемента.
		/// </summary>
		/// <returns>Копия.</returns>
		public override ChartIndicatorElement Clone()
		{
			var clone = FillClone(new ChartIndicatorElement
			{
				Title = Title,
				Color = Color,
				ToolTip = ToolTip,
				Indicator = Indicator,
				IndicatorPainter = IndicatorPainter,
			});

			if (clone.Indicator != null)
				clone.Indicator = PersistableHelper.Clone(clone.Indicator);

			return clone;
		}

		/// <summary>
		/// Получить строковое представление.
		/// </summary>
		/// <returns>Строковое представление.</returns>
		public override string ToString()
		{
			return Title;
		}
	}
}